package com.ch.ba02;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.util.Date;

/**
 * @author chenhong
 * @version 1.0.0
 * @ClassName MyAspect.java
 * @Description TODO
 * @createTime 2020年12月11日 21:45:00
 */

//注解作用 表示该类为切面类

@Aspect
public class MyAspect {

   /* @Before(value = "execution(public void com.ch.ba01.impl.SomeServiceImpl.doSome(String,Integer))")
    public void myBefore(){
        System.out.println("切面功能： 在目标方法执行之前 打印当前时间" + new Date());
    }*/

    /**
     * 如果你的切面功能中需要用到方法的信息，则加入JointPoint,必须为第一个参数
     */
     @Before(value = "execution(* *..SomeServiceImpl.doSome(..))")
    public void myBefore(JoinPoint jp){
         System.out.println("签名" + jp.getSignature());
         System.out.println("方法名称" + jp.getSignature().getName());

         //获取方法参数
         Object []args  = jp.getArgs();
         for(Object arg :args){
             System.out.println(arg);
         }
        System.out.println("切面功能： 在目标方法执行之前 打印当前时间" + new Date());
    }


    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther(..))" , returning = "res")
    public void myAfter(Object res){
        System.out.println("后置通知 : 获取的目标方法的返回值为" + res + "EveryDay");

    }


    /**
     * @Around环绕通知
     * 在目标方法前后都能使用
     * 控制目标方法是否被调用执行
     * 修改原来目标方法的结果
     *
     * 等同于jdk的动态代理
     * 参数：ProceedingJoinPoint 等同于动态代理的 Method
     * 返回值：目标方法的执行结果 可以被修改
     */

    @Around(value = "execution(* *..SomeServiceImpl.doThree(..))")
    public Object MyAround(ProceedingJoinPoint pjp) throws Throwable {

        Object result = null;
        String name ="";
        Object []args = pjp.getArgs();
        if(args != null && args.length > 0){
            name = (String) args[0];
        }
        System.out.println("环绕通知 在目标方法之前输入时间" + new Date());

        //1.目标方法的调用
        //等同于 method.invoke()
        if("kk".equals(name)){
            result = pjp.proceed();
            result = name + "ks";
        }else if(name != null){
            result = pjp.proceed();
            result = name + "kf";
        }
        System.out.println("环绕通知 在目标方法调用之后 提交事务");

        return result;

    }
}
